[LeetCode] Two Sum


leetcode

本系列前面的话

这段时间经历了一些事情,思考了很多,还有发现博客很久没写了,域名也因为没有续费被回收,想想博客还是要继续下去的,索性域名先不要了,等以后再换个好记的。
以前很少刷算法题,因为感觉工作中不会用到太多。其实到后来想想,原来是自己给自己的定位就是不写算法,因而找不到涉及算法的工作。现在趁着当前人工智能领域的浪潮,看看算法,顺便练习下Python,希望可以赶上这波潮流。

题目:Two Sum

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:

Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

问题解析

问题很好理解,给出一个数组和target,找出数组里相加之和为target的两个数字的位置。

这里一个坑就是要注意负数

解决方案

暴力法

暴力方法很好想到,就是从数组第一个数字开始,依次循环往下加,直到加和等于target。这是最简单的方法,也是复杂度很高的方法。

Java代码:

public int[] twoSum(int[] nums, int target) {
  for (int i = 0; i < nums.length; i++) {
      for (int j = i + 1; j < nums.length; j++) {
          if (nums[j] == target - nums[i]) {
          return new int[] { i, j };
          }
      }
  }
  throw new IllegalArgumentException("No two sum solution");
}

Python代码

class Solution:
  def twoSum(self, nums, target):
  """
  :type nums: List[int]
  :type target: int
  :rtype: List[int]
  """
  for i in range(len(nums) - 1):
  for j in range(i + 1, len(nums)):
  if nums[i] + nums[j] == target:
  return [i, j]
  return []

#if __name__ == "__main__":
# sol = Solution()
# results = sol.twoSum((3, 2, 4), 6)
# print("result is ", results)

Python代码很暴力,但在leetcode上运行最后一个丧心病狂的TestCase时花了7秒多,超出了规定时间,所以需要简单优化一下。
待续

复杂度

  • 时间复杂度:O(n²).对每个元素,我们都要循环查找数组内的剩余元素,这需要O(n)的时间,所以整体运行下来需要O(n²)
  • 空间复杂度:O(1).

文章作者: Wossoneri
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 Wossoneri !
评论
  目录